// Copyright (c) Appeon. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.

using System;
using SnapObjects.Commons;

namespace SnapObjects.Expressions
{
    internal class EvaluateTypeSynchronizer : TypeSynchronizer<EvaluateResult>
    {
        protected override EvaluateResult Convert(EvaluateResult node, Type type)
        {
            return new EvaluateResult(Utils.ChangeType(node.Value, type), type);
        }

        protected override Type GetType(EvaluateResult node)
        {
            var type = node.Type;

            if (type == typeof(object) && node.Value != null)
            {
                type = node.Value.GetType();

                node.Type = type;
            }

            return type;
        }

        protected override EvaluateResult ToString(EvaluateResult node)
        {
            var value = node.Value?.ToString();

            return new EvaluateResult(value, typeof(string));
        }
    }
}
